package DoublePointer;

import org.junit.Test;

import java.util.Arrays;

/**
 * @BelongsProject: SeniorArchitect-LeetCode
 * @BelongsPackage: DoublePointer
 * @Author: zhuangxiaoyan
 * @CreateTime: 2023-10-22  08:35
 * @Description: TODO
 * @Version: 1.0
 */
public class 两数之和II167 {

    // 采用暴力的方法就是固定一个然后在去找其他的一个方法
    public int[] twoSum2(int[] numbers, int target) {
       for (int i=0;i<numbers.length;i++){
           for (int j=i+1;j<numbers.length;j++){
               if (numbers[j]+numbers[i]==target){
                   return new int[]{i+1,j+1};
               }
           }
       }
       return new int[]{-1,-1};
    }

    // 在数组中找到两个数，使得它们的和等于目标值，可以首先固定第一个数，然后寻找第二个数，第二个数等于目标值减去第一个数的差。利用数组的有序性质，可以通过二分查找的方法寻找第二个数。为了避免重复寻找，在寻找第二个数时，只在第一个数的右侧寻找。
    public int[] twoSum3(int[] numbers, int target) {
        for (int i = 0; i < numbers.length; ++i) {
            int low = i + 1, high = numbers.length - 1;
            while (low <= high) {
                int mid = (high - low) / 2 + low;
                if (numbers[mid] == target - numbers[i]) {
                    return new int[]{i + 1, mid + 1};
                } else if (numbers[mid] > target - numbers[i]) {
                    high = mid - 1;
                } else {
                    low = mid + 1;
                }
            }
        }
        return new int[]{-1, -1};
    }

    // 采用双指针的方法来实现
    public int[] twoSum(int[] numbers, int target) {
        int left = 0, right = numbers.length - 1;
        while (left <= right) {
            if (numbers[left] + numbers[right] > target) {
                right--;
            } else if (numbers[left] + numbers[right] < target) {
                left++;
            } else {
                break;
            }
        }
        return new int[]{left+1, right+1};
    }

    @Test
    public void test(){
        int[] ints = twoSum(new int[]{2,3,4}, 6);
        System.out.println(Arrays.toString(ints));
    }

}
